package com.knowledge.review.designPatterns.behavioralpattern.mementopattern;

import lombok.AllArgsConstructor;
import lombok.Data;

// 游戏角色类
@Data
public class GameRole {
    private Integer vit; // 生命力
    private Integer atk; // 攻击力
    private Integer def; // 防御力
    // 初始化状态
    public void init() {
        this.vit = 100;
        this.atk = 100;
        this.def = 100;
    }
    // 战斗到0
    public void fight() {
        this.vit = 0;
        this.atk = 0;
        this.def = 0;
    }
    // 保存角色状态
    public RoleStateMemento saveState() {
        return new RoleStateMemento(this.vit, this.atk, this.def);
    }
    // 回复角色状态
    public void recoverState(RoleStateMemento roleStateMemento) {
        this.vit = roleStateMemento.getVit();
        this.atk = roleStateMemento.getAtk();
        this.def = roleStateMemento.getDef();
    }
    // 展示状态
    public void showState() {
        System.out.println("角色生命力:" + this.vit);
        System.out.println("角色攻击力:" + this.atk);
        System.out.println("角色防御力:" + this.def);
    }
}
// 游戏状态存储类(备忘录类)
@Data
@AllArgsConstructor
class RoleStateMemento {
    private Integer vit; // 生命力
    private Integer atk; // 攻击力
    private Integer def; // 防御力
}
// 角色状态管理者类
@Data
class RoleStateCaretaker {
    private RoleStateMemento roleStateMemento;
}

class Test{
    // 测试结果
    public static void main(String[] args){
        System.out.println("===========打boss前状态===========");
        GameRole gameRole = new GameRole();
        gameRole.init();
        gameRole.showState();
        // 保存进度
        RoleStateCaretaker roleStateCaretaker = new RoleStateCaretaker();
        roleStateCaretaker.setRoleStateMemento(gameRole.saveState());
        System.out.println("===========打boss后状态===========");
        gameRole.fight();
        gameRole.showState();
        System.out.println("===========恢复状态===========");
        gameRole.recoverState(roleStateCaretaker.getRoleStateMemento());
        gameRole.showState();
        // ===========打boss前状态===========
        // 角色生命力:100
        // 角色攻击力:100
        // 角色防御力:100
        // ===========打boss后状态===========
        // 角色生命力:0
        // 角色攻击力:0
        // 角色防御力:0
        // ===========恢复状态===========
        // 角色生命力:100
        // 角色攻击力:100
        // 角色防御力:100
    }
}
 